package cn.edu.hit.core;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 服务加载器 使用Map作为适配选择的Loader实现
 *
 * @param <ID>  原数据的ID的类型
 * @param <R>   转换后的结果类型
 * @param <C>   配置类型
 * @param <ARG> 转换函数所需的额外参数的类型
 * @param <A>   适配器接口类型
 */
public abstract class MappedLoader<ID, R, C, ARG, A extends Adapter<ID, ARG, R, C>> extends Loader<ID, R, C, ARG, A> {
    /**
     * 初始化
     *
     * @param tClass 适配器接口类型
     */
    protected MappedLoader(Class<A> tClass) {
        super(tClass);
    }

    protected Map<String, A> adapterMap = new ConcurrentHashMap<>();

    @Override
    protected A getAdapter(String type) {
        if (adapterMap.containsKey(type)) {
            return adapterMap.get(type);
        } else {
            A adapter = super.getAdapter(type);
            adapterMap.put(type, adapter);
            return adapter;
        }
    }

    public void replaceAdapter(String type, A adapter) {
        adapterMap.put(type, adapter);
        super.adapters.removeIf(a -> a.accept(type));
        super.adapters.add(adapter);
    }

    public void addAdapter(String type, A adapter) {
        if (!this.hasAdapter(type)) {
            adapters.add(adapter);
        }
    }

    public boolean hasAdapter(String type) {
        return adapters.stream().filter(adapter -> adapter.accept(type)).findAny().isPresent();
    }
}
